package com.qf.core.utils;

import com.qf.core.exception.BaseException;
import com.qf.core.response.ResponseCode;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;

/**
 * @Author: sin
 * @Date: 2025/5/22 15:29
 * @Description: 文件名工具类
 **/
public class FileUtils {

    /**
     * IMAGE_SCALE : 图片缩放比例（如 1.0 为不缩放）
     **/
    public static final Double IMAGE_SCALE = 0.9;

    /**
     * IMAGE_QUALITY : 图片输出质量（0.0 ~ 1.0）
     **/
    public static final Double IMAGE_QUALITY= 0.7;

    /**
     * 生成唯一文件名
     * @param filename  文件名
     * extension 文件扩展名，如 ".jpg" 或 "png"
     * @return 生成后的文件名，如 "xxx.png"
     * String.format("%s.%s", key, extension);  %s.%s   %s相当于动态参数  用于参数拼接
     */
    public static String generateUniqueFileName(String filename) {
        String extension = getFileExtension(filename);
        // （拼接时间戳并 将 UUID 字符串中的 - 替换成空字符串） 1719123456789-550e8400e29b41d4a716446655440000
        String key = System.currentTimeMillis() + "-" + UUID.randomUUID().toString().replace("-", "");
        return String.format("%s.%s", key, extension);
    }

    /**
     * 获取文件扩展名（无点号）
     *
     * @param filename 原始文件名
     * @return 文件扩展名，如 "png"、"jpg"，若无扩展名则返回空字符串
     */
    public static String getFileExtension(String filename) {
        if (filename == null || !filename.contains(".")) {
            return "";
        }
        return filename.substring(filename.lastIndexOf('.') + 1);
    }

    /**
     * 判断是否是图片，且非GIF格式（只压缩静态图片）
     */
    public static boolean isStaticImage(MultipartFile file) {
        String contentType = file.getContentType();
        String originalFilename = file.getOriginalFilename();
        if (contentType == null || !contentType.toLowerCase().startsWith("image/")) {
            return false;
        }
        // GIF动画不压缩
        return originalFilename == null || !originalFilename.toLowerCase().endsWith(".gif");
    }

    public static Map<String, Object> extractMultipartInfo(MultipartFile file) {
        if (file == null) return Map.of();
        return Map.of(
                "name", safe(file.getName()),
                "originalFilename", safe(file.getOriginalFilename()),
                "size", file.getSize(),
                "remark","AOP记录未压缩文件大小"
        );
    }

    private static String safe(String str) {
        return str != null ? str : "未知名称";
    }

    /**
     * 压缩 MultipartFile 类型的图片，并返回新的 MultipartFile
     *
     * @param file      原始图片文件
     * @param scale     尺寸 0.0 ~ 1.0  原始尺寸 1.0
     * @param quality   初始压缩质量（建议 0.7~0.9）  可以用设定的常量，可以自己传
     * @return 压缩后的 MultipartFile
     */
    public static MultipartFile compressImageToMultipartFile(MultipartFile file, double scale, double quality)  {
        // gjf/800KB 以下 不压缩
        if(!isStaticImage(file)||file.getSize() < 800 * 1024) return file;
        // 内存流
        ByteArrayOutputStream base = new ByteArrayOutputStream();

        // 使用 Thumbnails 进行压缩，输出到内存中
        try {
            Thumbnails.of(file.getInputStream())
                    .scale(scale)               // 缩放比例（如 1.0 为不缩放）
                    .outputQuality(quality)     // 输出质量（0.0 ~ 1.0）
                    .toOutputStream(base);      // 输出到内存
        } catch (IOException e) {
            throw new RuntimeException("图片处理异常");
        }

        // 构建新的 MultipartFile
        byte[] compressedBytes = base.toByteArray();
        return new CustomMultipartFile(
                compressedBytes,
                file.getName(),
                file.getOriginalFilename(),
                file.getContentType()
        );
    }
}
